package com.zoe.flowable.controller;

import com.zoe.flowable.result.R;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.DeploymentBuilder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * @author zbg
 * @date 2023/07/22
 * @description
 */
@RestController
@RequiredArgsConstructor
public class DeployController {

    private final RepositoryService repositoryService;

    /**
     * 部署
     * @param file 文件
     * @return {@link R}
     */
    @SneakyThrows
    @PostMapping("deploy")
    public R deploy(MultipartFile file) {
        // 关键的⽅法是 addInputStream，通过该⽅法去指定流程⽂件。
        // 官⽅的提供的指定流程⽂件的⽅式有好⼏种；除了addInputStream之外
        // 另外还有⼀个 addString，这个就是将 流程 ⽂件转为⼀个字符串传⼊进来；
        // addBytes 是将 流程 ⽂件转为字节数组传进来；
        // addClasspathResource ⽅法则是直接从 classpath ⽬录下去加载 流程⽂件，
        // 这⼏个⽅法根据⾃⼰的使⽤场景选择⼀个合适的⽅法去调⽤即可。
        DeploymentBuilder deploymentBuilder = repositoryService.createDeployment()
                                                               .category("zoe工作分类")
                                                               .name("zoe工作流名称")
                                                               .addInputStream(file.getOriginalFilename(), file.getInputStream()).key("zoe工作流key");
        Deployment deployment = deploymentBuilder.deploy();
        // ACT_RE_DEPLOYMENT 和 ACT_RE_PROCDEF表是一对一的关系
        return R.success();
    }
}
